/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ictius.estructuras.implement;

import ictius.demonio.Informante;
import ictius.estructuras.Estructura;
import ictius.estructuras.Pila;
import ictius.excepciones.DesapilaException;
import ictius.excepciones.PilaExceptions;

import java.util.Vector;

/**
 *
 * @author Tadeo
 */
public class PilaVector extends Estructura implements Pila {

    /**
     * Objeto de tipo Vector tomado de <i>java.util.Vector</i>.
     */
	private Vector<Object> unVector = new Vector<Object>();
    /**
     * Puntero para controlar el objeto Vector.
     */
    private int i;

    /**
     * Constructor del Vector Modelo (o Vector ideal).
     */
    public PilaVector() {
        Informante.asustar("Se ha creado una Pila de tipo Vector " + this);
        i = 0;
    }

    /**
     * Agrega un elemento nuevo al Vector.
     * @param x es el objeto recibido para guardar.
     */
    public void apilar(Object x) {
        Informante.asustar("Objeto apilado en el Vector: " + x);
        unVector.add(x);
        Informante.asustar("Tamaño del vector en " + this.getClass() + " es " + unVector.size());
        i++;
    }

    /**
     * Regresa un objeto apilado en el Vector, el primer elemento.
     * @return primer elemento.
     */
    public Object primerElemento() throws PilaExceptions {
        return unVector.firstElement();
    }

    /**
     * Regresa un objeto apilado en el Vector, el último elemento insertado.
     * @return último elemento.
     */
    @Override
    public Object ultimoElemento() throws PilaExceptions {
        return unVector.lastElement();
    }

    /**
     * Quita un elemento de Vector dado por la posición de i.
     * @return el objeto desapilo.
     */
    @Override
    public Object desapila() throws DesapilaException {
    	Informante.asustar("Se ha quitado un elemento de la Pila con el método desapila()");
        if(this.esVacia())
            return null;
        else
            return unVector.elementAt(--i);
            
    }

    /**
     * Elimina (sin devolver algo) el último elemento insertado en la pila.
     * @throws PilaExceptions 
     */
    @Override
    public void desapilar() throws DesapilaException {
            Informante.asustar("Se ha quitado un elemento de la Pila con el método desapilar()");
        try {
            unVector.elementAt(--i);
            System.out.println("Algo no ha salido bien, posiblemente no había nada en la pila.");
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println(e + " EXPLOTÓ!!");
        }
            
    }

}
